package com.itheima.d5_polymorphic.demo4;


import com.itheima.d5_polymorphic.demo3.Animal;
import com.itheima.d5_polymorphic.demo3.Cat;
import com.itheima.d5_polymorphic.demo3.Dog;

//目标：了解多态下引用数据类型的类型转换操作
public class Demo {
    public static void main(String[] args) {
        /**
         * 格式：子类  变量 = （子类）被转换的数据;
         * 需求：定义一个feedAnimal(Animal animal)方法，利用多态转型，在方法中使用Dog和Cat的特有功能
         */
        //2.测试功能
        feedAnimal(new Dog()); //参数传递后，底层：Animal animal = new Dog();
        System.out.println("--------------");

        feedAnimal(new Cat()); //参数传递后，底层：Animal animal = new Cat();

    }

    public static void feedAnimal(Animal animal) {
        animal.eat();

        //1.开始转型：强转成狗
        //Dog dog = (Dog) animal;  //如果此时animal实际接收的是Cat对象，转成Dog会运行报错！
        //ClassCastException：类转换异常！
        //dog.lookHome();

        //2.直接强转会出问题，所以先判断再强转！
        //使用instanceof运算符，作用：判断左边的数据是否是右边的类型，是返回true，不是返回false
        if (animal instanceof Dog) {
            //条件成立，说明animal真实类型是Dog，可以强转
            Dog dog = (Dog) animal;
            dog.lookHome();
            //jdk高版本对instanceof运算做了优化，可以在底层自动强转
        } else if (animal instanceof Cat cat) {
            cat.catchMouse();
        }
    }
}
